#include <wx/defs.h>
#include <wx/checklst.h>
#include "wxschecklistbox.h"

namespace {
  wxsRegisterItem<wxsCheckListBox> Reg( _T( "CheckListBox" ), _T( "复选列表框" ), wxsTWidget, _T( "标准" ), 320 );
  WXS_ST_BEGIN( wxsCheckListBoxStyles, _T( "" ) )
  WXS_ST_CATEGORY( "wxCheckListBox" )
  WXS_ST( wxLB_SINGLE )
  WXS_ST( wxLB_MULTIPLE )
  WXS_ST( wxLB_EXTENDED )
  WXS_ST( wxLB_HSCROLL )
  WXS_ST( wxLB_ALWAYS_SB )
  WXS_ST( wxLB_NEEDED_SB )
  WXS_ST( wxLB_SORT )
  WXS_ST_DEFAULTS()
  WXS_ST_END()
  WXS_EV_BEGIN( wxsCheckListBoxEvents )
  WXS_EVI( EVT_CHECKLISTBOX, wxEVT_COMMAND_CHECKLISTBOX_TOGGLED, wxCommandEvent, Toggled )
  WXS_EVI( EVT_LISTBOX, wxEVT_COMMAND_LISTBOX_SELECTED, wxCommandEvent, Select )
  WXS_EVI( EVT_LISTBOX_DCLICK, wxEVT_COMMAND_LISTBOX_DOUBLECLICKED, wxCommandEvent, DClick )
  WXS_EV_END()
}

wxsCheckListBox::wxsCheckListBox( wxsItemResData* Data ):
  wxsWidget( Data, &Reg.Info, wxsCheckListBoxEvents, wxsCheckListBoxStyles ) {}

void wxsCheckListBox::OnBuildCreatingCode() {
  switch( GetLanguage() ) {
    case wxsCPP: {
      AddHeader( _T( "<wx/checklst.h>" ), GetInfo().ClassName, hfInPCH );
      Codef( _T( "%C(%W, %I, %P, %S, 0, 0, %T, %V, %N);\n" ) );
      for( size_t i = 0; i <  ArrayChoices.GetCount(); ++i ) {
        if( ArrayChecks[i] ) {
          Codef( _T( "%ACheck(" ) );
        }
        Codef( _T( "%AAppend(%t)" ), ArrayChoices[i].wx_str() );
        if( ArrayChecks[i] ) {
          Codef( _T( ")" ) );
        }
        Codef( _T( ";\n" ) );
      }
      BuildSetupWindowCode();
      return;
    }
    case wxsUnknownLanguage:
    default: {
      wxsCodeMarks::Unknown( _T( "wxsCheckListBox::OnBuildCreatingCode" ), GetLanguage() );
    }
  }
}

wxObject* wxsCheckListBox::OnBuildPreview( wxWindow* Parent, long Flags ) {
  wxCheckListBox* Preview = new wxCheckListBox( Parent, GetId(), Pos( Parent ), Size( Parent ), 0, 0, Style() );
  for( size_t i = 0; i < ArrayChoices.GetCount(); ++i ) {
    int Val = Preview->Append( ArrayChoices[i] );
    if( ArrayChecks[i] ) {
      Preview->Check( Val );
    }
  }
  return SetupWindow( Preview, Flags );
}

void wxsCheckListBox::OnEnumWidgetProperties( M_Code_unused long Flags ) {
  WXS_ARRAYSTRINGCHECK( wxsCheckListBox, ArrayChoices, ArrayChecks, _T( "Choices" ), _T( "content" ), _T( "item" ) );
}
